1 using System;
2 using UnityEngine;
3 using UnityStandardAssets.CrossPlatformInput;
4
5 namespace UnityStandardAssets.Characters.FirstPerson
6 {
7 [Serializable]
8 public class MouseLook
9 {
10 public float XSensitivity = 2f;
11 public float YSensitivity = 2f;
12 public bool clampVerticalRotation = true;
13 public float MinimumX = -90F;
14 public float MaximumX = 90F;
15 public bool smooth;
16 public float smoothTime = 5f;
17 public bool lockCursor = true;
18
19
20 private Quaternion m_CharacterTargetRot;
21 private Quaternion m_CameraTargetRot;
22 private bool m_cursorIsLocked = true;
23
24 public void Init(Transform character, Transform camera)
25 {
26 m_CharacterTargetRot = character.localRotation;
27 m_CameraTargetRot = camera.localRotation;
28 }
29
30
31 public void LookRotation(Transform character, Transform camera)
32 {
33 float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;
34 float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;
35
36 m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f);
37 m_CameraTargetRot *= Quaternion.Euler (-xRot, 0f, 0f);
38
39 if(clampVerticalRotation)
40 m_CameraTargetRot = ClampRotationAroundXAxis (m_CameraTargetRot);
41
42 if(smooth)
43 {
44 character.localRotation = Quaternion.Slerp (character.localRotation, m_CharacterTargetRot,
45 smoothTime * Time.deltaTime);
46 camera.localRotation = Quaternion.Slerp (camera.localRotation, m_CameraTargetRot,
47 smoothTime * Time.deltaTime);
48 }
49 else
50 {
51 character.localRotation = m_CharacterTargetRot;
52 camera.localRotation = m_CameraTargetRot;
53 }
54
55 UpdateCursorLock();
56 }
57
58 public void SetCursorLock(bool value)
59 {
60 lockCursor = value;
61 if(!lockCursor)
62 {//we force unlock the cursor if the user disable the cursor locking helper
63 Cursor.lockState = CursorLockMode.None;
64 Cursor.visible = true;
65 }
66 }
67
68 public void UpdateCursorLock()
69 {
70 //if the user set "lockCursor" we check & properly lock the cursos
71 if (lockCursor)
72 InternalLockUpdate();
73 }
74
75 private void InternalLockUpdate()
76 {
77 if(Input.GetKeyUp(KeyCode.Escape))
78 {
79 m_cursorIsLocked = false;
80 }
81 else if(Input.GetMouseButtonUp(0))
82 {
83 m_cursorIsLocked = true;
84 }
85
86 if (m_cursorIsLocked)
87 {
88 Cursor.lockState = CursorLockMode.Locked;
89 Cursor.visible = false;
90 }
91 else if (!m_cursorIsLocked)
92 {
93 Cursor.lockState = CursorLockMode.None;
94 Cursor.visible = true;
95 }
96 }
97
98 Quaternion ClampRotationAroundXAxis(Quaternion q)
99 {
100 q.x /= q.w;
101 q.y /= q.w;
102 q.z /= q.w;
103 q.w = 1.0f;
104
105 float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan (q.x);
106
107 angleX = Mathf.Clamp (angleX, MinimumX, MaximumX);
108
109 q.x = Mathf.Tan (0.5f * Mathf.Deg2Rad * angleX);
110
111 return q;
112 }
113
114 }
115 }